local mobile = KEYS[1]
--短信发送间隔
local limitInterval = tonumber(KEYS[2])
local limitHour = tonumber(KEYS[3])
local limitDay = tonumber(KEYS[4])
local dayExpireTime = tonumber(KEYS[5])
local keyMobile = 'SmsMobileAuth:' .. mobile
local keyLimitHourCount = 'SmsMobileAuth:LimitHour:' .. mobile
local keyLimitDayCount = 'SmsMobileAuth:LimitDay:' .. mobile

--[[校验短信每小时发送量
    0： 不限制发送量
    1： 还未发送短信
    2： 超过发送限制
    3： 已发送短信，还未超限
]]
local function checkDay()
    if limitDay == -1 then
        --   日限额不限制
        return 0
    else
        local day_count = redis.call('GET', keyLimitDayCount)
        if day_count == false then
            return 1
        else
            --自然日内已经发送过短信
            local num_day_count = tonumber(day_count)
            if num_day_count + 1 > limitDay then
                return 2
            else
                return 3
            end
        end
    end
end
--[[校验短信每小时发送量
    0： 不限制发送量
    1： 还未发送短信
    2： 超过发送限制
    3： 已发送短信，还未超限
]]
local function checkHour()
    if limitHour == -1 then
        return 0
    else
        local hour_count = redis.call('GET', keyLimitHourCount)
        --先判断每小时的发送量是否超过限制
        if hour_count == false then
            return 1
        else
            --自然日内已经发送过短信
            local num_hour_count = tonumber(hour_count)
            if num_hour_count + 1 > limitHour then
                return 2
            else
                return 3
            end
        end
    end
end
--[[校验短信发送频率
    0： 不限制发送频率
    1： 校验通过
    2： 校验失败
]]
local function checkMobile()

    if limitInterval == -1 then
        return 0
    else
        local mobile_exist = redis.call('GET', keyMobile)
        if mobile_exist == false then
            return 1
        else
            return 2
        end
    end
end


--[[
    01：短信发送频率过高
    02: 单位小时内短信发送量超限
    03: 自然日内短信发送量超限
]]
local mobile_check_result = checkMobile()
if mobile_check_result == 2 then
    return '01'
end

local hour_check_result = checkHour()

if hour_check_result == 2 then
    return '02'
end

local day_check_result = checkDay()

if day_check_result == 2 then
    return '03'
end
if limitInterval ~= -1 then
    redis.call('SET', keyMobile, 1)
    redis.call('EXPIRE', keyMobile, limitInterval)
end
if hour_check_result == 1 then
    redis.call('SET', keyLimitHourCount, 1)
    redis.call('EXPIRE', keyLimitHourCount, 3600)
else
    redis.call('INCRBY', keyLimitHourCount, 1)
end

if day_check_result == 1 then
    redis.call('SET', keyLimitDayCount, 1)
    redis.call('EXPIRE', keyLimitDayCount, dayExpireTime)
else
    redis.call('INCRBY', keyLimitDayCount, 1)
end

return '00'